#include <LiquidCrystal.h>        // Librería para el LCD

void readButtons(){            // Leer botones del volante Referencia desde +12 de Vin        para +12->10k; para +5->220omn
 VbuttonsD = analogRead(Vbuttons);      //leer VButtonsD
 Serial.print("Botones(0-1023)=");     //Mostrar valor leido por serial
 Serial.println(VbuttonsD);
 Serial.println();

 if (botonLeido) {
   if((VbuttonsD>=265)&&(VbuttonsD<=370)){                //270    278 364    -
       botonPulsado = 0;
       botonLeido = false;}
   else if((VbuttonsD>=422)&&(VbuttonsD<=540)){        //427    438    535 +
           botonPulsado = 1;
           botonLeido = false;}
   else if((VbuttonsD>=560)&&(VbuttonsD<=671)){        //560    579 666    O
           botonPulsado = 2;
           botonLeido = false;}
   else if((VbuttonsD>=676)&&(VbuttonsD<=773)){        //681    698 768    >
           botonPulsado = 3;
           botonLeido = false;}
   else if((VbuttonsD>=781)&&(VbuttonsD<=863)){        //786    806 858    <
           botonPulsado = 4;
           botonLeido = false;}
   else if((VbuttonsD>=867)&&(VbuttonsD<=929)){        //872    896 924    ^
           botonPulsado = 5;
           botonLeido = false;}
   }
switch(botonPulsado){                                //Comprobación botonera por serial BORRAR
   case 0:
       Serial.println("Boton -");
       break;
   case 1:
       Serial.println("Boton +");
       break;
   case 2:
       Serial.println("Boton O");
       break;
   case 3:
       Serial.println("Boton >");
       break;
   case 4:
       Serial.println("Boton <");
       break;
   case 5:
       Serial.println("Boton ^");
       break;        }
//botonLeido = true;
//botonPulsado = 6;
}

/*void toRoot() {
       setCurrent( &getRoot() );
    }*/

void printLCD (int menuLCD){
   lcd.clear();
   switch (menuLCD){
       case 0:{                    // menu root
           lcd.clear();
           lcd.setCursor(0,0);
           lcd.write(1);
           if (vB1 < 10.00) {
               lcd.print(" ");}
           lcd.print(vB1);
           lcd.setCursor(5,0);
           lcd.print("v ");
           
           // Escribir la hora                        
           Wire.beginTransmission(DS1307_I2C_ADDRESS);
           Wire.write(zero);
           Wire.endTransmission();

           Wire.requestFrom(DS1307_I2C_ADDRESS, 7);
           second     = bcdToDec(Wire.read() & 0x7f);    // Lee secuencialmente, si no se leen los segundos toma mal los valores de hora y minuto
           minute     = bcdToDec(Wire.read());
           hour       = bcdToDec(Wire.read() & 0x3f);  // Need to change this if 12 hour am/pm

           if (hour < 10)
               lcd.print("0");
           lcd.print(hour, DEC);
           lcd.print(":");
           if (minute < 10)
               lcd.print("0");
           lcd.print(minute, DEC);
           //lcd.print("23:35");    EJEMPLO
           // Escribir la hora END
           
           if (simbAlt){
               lcd.setCursor(13,0);
               lcd.write(3);}
           if (simb220){
               lcd.setCursor(14,0);
               lcd.write(4);}
               else{
                   if(simbInv){
                       lcd.setCursor(14,0);
                       lcd.write(5);}}
           if (simbSol){
               lcd.setCursor(15,0);
               lcd.write(6);}
           lcd.setCursor(0,1);        // segunda linea
           lcd.write(2);
           if (vB2 < 10.00) {
               lcd.print(" ");}
           lcd.print(vB2);
           lcd.setCursor(5,1);
           lcd.print("v ");
           //escribir el amperaje
           if ((aB2 >= 0.00)||(aB2 < 10.00)){
               lcd.print(" ");}
           lcd.print(aB2);
           lcd.print("A");
           if(simbCal){
               lcd.setCursor(14,1);
               lcd.write(7);}
           if(simbLuc){
               lcd.setCursor(15,1);
               lcd.write(8);}
       break;}
       case 1:{                            // Calefaccion
           lcd.clear();
           lcd.print("Calefaccion");
           lcd.setCursor(0,1);
           lcd.print("Inversor       >");
       break;}
       case 11:{                            // Apagar calefaccion
           lcd.clear();
           lcd.print("Calefaccion");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    >");
       break;}
       case 12:{                            // Encender calefaccion
           lcd.clear();
           lcd.print("Calefaccion");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}        
       case 13:{                            // Termostato calefaccion
           lcd.clear();
           lcd.print("Calefaccion");
           lcd.setCursor(0,1);
           lcd.print("Temp.    (OK)  >");
       break;}
       case 14:{                            // Cronometro calefaccion
           lcd.clear();
           lcd.print("Calefaccion");
           lcd.setCursor(0,1);
           lcd.print("Crono     (OK) >");
       break;}
       case 15:{                            // Fecha encendido calefaccion
           lcd.clear();
           lcd.print("Calefaccion");
           lcd.setCursor(0,1);
           lcd.print("Fecha enc (OK) <");
       break;}        
       case 2:{                            // Inversor
           lcd.clear();
           lcd.print("Inversor");
           lcd.setCursor(0,1);
           lcd.print("Iluminacion    >");
       break;}
       case 21:{                            // Encender inversor
           lcd.clear();
           lcd.print("Inversor");
           //lcd.print("Encender    (OK)");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}
       case 22:{                            // Apagar inversor
           lcd.clear();
           lcd.print("Inversor");
           //lcd.print("Apagar      (OK)");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    <");
       break;}        
       case 3:{                            // Iluminacion
           lcd.clear();
           lcd.print("Iluminacion");
           lcd.setCursor(0,1);
           lcd.print("Seguridad      >");
       break;}        
       case 31:{                            // Iluminacion automatica
           lcd.clear();
           lcd.print("Iluminacion");
           lcd.setCursor(0,1);
           lcd.print("Luces auto (OK)>");
       break;}
       case 311:{                            //      "            "        encender
           lcd.clear();
           lcd.print("Luces auto");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}
       case 312:{                            //        "            "        apagar
           lcd.clear();
           lcd.print("Luces auto");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    <");
       break;}
       case 32:{                            //         "        diurna
           lcd.clear();
           lcd.print("Iluminacion");
           lcd.setCursor(0,1);
           lcd.print("Luces diur (OK)<");
       break;}
       case 321:{                            //        "            "        encender
           lcd.clear();
           lcd.print("Luces diurnas");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}
       case 322:{                            //        "            "        apagar
           lcd.clear();
           lcd.print("Luces diurnas");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    <");
       break;}        
       case 4:{                            // Seguridad
           lcd.clear();
           lcd.print("Seguridad");
           lcd.setCursor(0,1);
           //lcd.print("  (>)");
       break;}        
       case 41:{                            // Puertas
           lcd.clear();
           lcd.print("Seguridad");
           lcd.setCursor(0,1);
           lcd.print("Puertas    (OK)>");
       break;}
       case 411:{                            //         "        encender
           lcd.clear();
           lcd.print("Puertas");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}
       case 412:{                            //        "        apagar
           lcd.clear();
           lcd.print("Puertas");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    <");
       break;}
       case 42:{                            // RFID
           lcd.clear();
           lcd.print("Seguridad");
           lcd.setCursor(0,1);
           lcd.print("RFID (OK)      >");
       break;}
       case 421:{                            //        "        encender
           lcd.clear();
           lcd.print("RFID");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}
       case 422:{                            //        "        apagar
           lcd.clear();
           lcd.print("RFID");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    <");
       break;}        
       case 43:{                            // BIP
           lcd.clear();
           lcd.print("Seguridad");
           lcd.setCursor(0,1);
           lcd.print("BIP (OK)       >");
       break;}
       case 431:{                            //        "        encender
           lcd.clear();
           lcd.print("BIP");
           lcd.setCursor(0,1);
           lcd.print("Encender (OK)  >");
       break;}
       case 432:{                            //        "        apagar
           lcd.clear();
           lcd.print("BIP");
           lcd.setCursor(0,1);
           lcd.print("Apagar (OK)    <");
       break;}    
       
       case 91:{                            // Generico, no se usa
           lcd.clear();
           lcd.print("Encender    (OK)");
           lcd.setCursor(0,1);
           lcd.print("Apagar         >");
       break;}
       case 92:{                            // Generico, no se usa
           lcd.clear();
           lcd.print("Apagar      (OK)");
           lcd.setCursor(0,1);
           lcd.print("Encender       <");
       break;}
       
       default:{
           lcd.clear();
           lcd.print("Sin menu");
           lcd.setCursor(0,1);
           lcd.write(1);
           lcd.write(2);
           lcd.write(3);
           lcd.write(4);
           lcd.write(5);
           lcd.write(6);
           lcd.write(7);
           lcd.write(8);
       break;}
   }
           
}

void controlPantalla(){

Serial.println(digitalRead(PinPlafon));        // Prueba de lo que esta leyendo
 if (digitalRead(PinPrueba) == LOW){
   //lcd.display();
   /*if (borraPantalla == true){
       lcd.clear();
       borraPantalla = false;
       }*/
   lcd.display();
   analogWrite(12,50);
   Serial.println("Enciende pantalla");
   }else if (digitalRead(PinPrueba) == HIGH){
       lcd.noDisplay();
       analogWrite(12,0);
       /*borraPantalla = true;
       lcd.noDisplay();*/
       Serial.println("Apaga pantalla");
       }
}

void setup()
{
 // declaración de modo de los pines
 pinMode(VB1Input, INPUT);
 pinMode(VB2Input, INPUT);
 pinMode(Vbuttons, INPUT);
 pinMode(LEDpin, OUTPUT);
 pinMode(RBpin, OUTPUT);
 pinMode(PinInversor, OUTPUT);
 pinMode(PinCierraPuertas, OUTPUT);
 pinMode(PinAbrePuertas, OUTPUT);
 //pinMode(PinPosicion, OUTPUT);    // No hace falta, enciende posición y cruce con el mismo relé
 pinMode(PinCruce, OUTPUT);
 pinMode(PinNiebla, OUTPUT);
 //pinMode(Rx3, INPUT);
 //pinMode(Tx3, OUTPUT);
 pinMode(DHTPIN, INPUT);
 pinMode(PinCentralita, OUTPUT);
 pinMode(PinShunt, INPUT);
 pinMode(12, OUTPUT);
 pinMode(PinPlafon, INPUT);
 pinMode(PinPosicion, INPUT);
 pinMode(PinPrueba, INPUT);

 // crear caracteres
 lcd.createChar(1,chBateria1);
 lcd.createChar(2,chBateria2);
 lcd.createChar(3,chAlt);            // para usarlo, lcd.write(0);
 lcd.createChar(4,ch220);
 lcd.createChar(5,chInv);
 lcd.createChar(6,chSol);
 lcd.createChar(7,chCal);
 lcd.createChar(8,chLuc);

 Wire.begin();                            // Inicializa el I2C para el RTC
 // begin sending over serial port
 Serial.begin(9600);                    // consola serie del pc
 Serial2.begin(9600);                    // RFID
 Serial3.begin(9600);                    // Begin serial3 para Bluetooth  19200
 zero=0x00;                            //Para el RTC

 lcd.begin(16,2);                        // Inicializa el display
 printLCD(0);
 analogWrite(12, 255);                    // Encender led display
}


//////////////////////////////////////////Comienzo del programa//////////////////////////////////////
void loop(){
//lcd.begin(16,2);                        // Inicializa el display
//analogWrite(12, 255);            //0 siempre apagado -> 255 siempre encendido (led pantalla)
Serial.println("Led LCD");
//inversor =true;    //prueba

//Reloj
if (Serial.available()) {      // Look for char in serial que and process if found
   command = Serial.read();
     if (command == 84 || command == 116) {      //If command = "Tt" Set Date
      setDateDs1307();
      getDateDs1307();
      Serial.println(" ");
     }
     else if (command == 82 || command == 114) {      //If command = "Rr" Read Date ... BBR
      getDateDs1307();
      Serial.println(" ");
     }
     else if (command == 81 || command == 113) {      //If command = "Qq" RTC1307 Memory Functions
       delay(100);     
       if (Serial.available()) {
        command = Serial.read();
        if (command == 49) {        //If command = "1" RTC1307 Initialize Memory - All Data will be set to
                                      // 255 (0xff).  Therefore 255 or 0 will be an invalid value.  
          Wire.beginTransmission(DS1307_I2C_ADDRESS);   // 255 will be the init value and 0 will be considered
                                                         // an error that occurs when the RTC is in Battery mode.
          Wire.write(0x08); // Set the register pointer to be just past the date/time registers.
          for (i = 1; i <= 24; i++) {
              Wire.write(0Xff);
             delay(10);
          }   
          Wire.endTransmission();
          Wire.beginTransmission(DS1307_I2C_ADDRESS);   
          Wire.write(0x21); // Set the register pointer to 33 for second half of registers. Only 32 writes per connection allowed.
          for (i = 1; i <= 33; i++) {
              Wire.write(0Xff);
             delay(10);
          }   
          Wire.endTransmission();
          getDateDs1307();
          Serial.println(": RTC1307 Initialized Memory");
        }
        else if (command == 50) {      //If command = "2" RTC1307 Memory Dump
         getDateDs1307();
         Serial.println(": RTC 1307 Dump Begin");
         Wire.beginTransmission(DS1307_I2C_ADDRESS);
         Wire.write(zero);
         Wire.endTransmission();
         Wire.requestFrom(DS1307_I2C_ADDRESS, 32);
         for (i = 0; i <= 31; i++) {  //Register 0-31 - only 32 registers allowed per I2C connection
            test = Wire.read();
            Serial.print(i);
            Serial.print(": ");
            Serial.print(test, DEC);
            Serial.print(" : ");
            Serial.println(test, HEX);
         }
         Wire.beginTransmission(DS1307_I2C_ADDRESS);
         Wire.write(0x20);
         Wire.endTransmission();
         Wire.requestFrom(DS1307_I2C_ADDRESS, 32);  
         for (i = 32; i <= 63; i++) {         //Register 32-63 - only 32 registers allowed per I2C connection
            test = Wire.read();
            Serial.print(i);
            Serial.print(": ");
            Serial.print(test, DEC);
            Serial.print(" : ");
            Serial.println(test, HEX);
         }
         Serial.println(" RTC1307 Dump end");
        }
       }  
      }
     Serial.print("Command: ");
     Serial.println(command);     // Echo command CHAR in ascii that was sent
     }
     
     command = 0;                 // reset command
     delay(100);
     
//RTC end      

luces();
baterias();


// Leer estado bluetooth



Serial.println();


 ///////////////////////////////////////////////////////////////////////////////////////
 // Devuelve el valor de la corriente como un float
 /*if (sensorB2Pos.getCurrent() > sensorB2Neg.getCurrent()){
   aB2 = sensorB2Pos.getCurrent();}
   else{
   if(sensorB2Pos.getCurrent() < sensorB2Neg.getCurrent()){
       aB2 = sensorB2Neg.getCurrent();
       aB2 = aB2*(-1);}
       else{
       aB2 = 0.0;}}
 Serial.println(aB2);*/
 //lcd.setCursor(7,1);
 //lcd.print(aB2);
 //lcd.print("A");


 puertas();
 //controlInversor();        //Habilitar cuando este el menu funcionando


 // Actualiza estado bluetooth

 // Leer los botones
 readButtons();
 //Borrar cuando este el menu, enciende el inversor con el O (2), apaga con ^ (5)
 if ((botonLeido == false) && (botonPulsado == 2)){
   inversor = true;
   controlInversor();
   botonLeido = true;
   botonPulsado = 6;
   } else if ((botonLeido == false) && (botonPulsado == 5)){
       inversor =false;
       controlInversor();
       botonLeido = true;
       botonPulsado = 6;
       }else{
           botonLeido = true;
           botonPulsado = 6;
           }



 printLCD(0);
 controlPantalla();

 Serial.print("Pin posicion");
 Serial.println(digitalRead(PinPosicion));

 Serial.print("Pin prueba");
 Serial.println(digitalRead(PinPrueba));
 readBT();

 /*delay(1000);
 printLCD(1);
 delay(1000);
 printLCD(2);
 delay(1000);
 printLCD(13);
 delay(2000);
 printLCD(22);
 delay(2000);
 printLCD(3);
 delay(1000);
 printLCD(311);
 delay(1000);
 printLCD(312);
 delay(1000);
 printLCD(32);
 delay(1000);
 printLCD(321);
 delay(1000);
 printLCD(4);             //borrar cuando estén terminados los menús
 delay(1000);
 //printLCD(1);*/

 // sleep...
 Serial.println("=========== Empieza prueba serial");        // Separación entre cada loop

 //       getDateDs1307();                //BORRAR
 //     Serial.println(" ");                //BORRAR   
//tempHumi();    
Serial.println(readTemp());  

/*  Serial3.println("Serial 3 loop");
 Serial1.println("Serial 1 loop");
 Serial2.println("Serial 2 loop");
 Serial1.begin(300);                    // 300, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 38400, 57600, or 115200
 Serial1.println("300");
 delay(500);
 Serial1.end();
 Serial.println("300");

 Serial1.begin(1200);
 Serial1.println("1200");
 delay(500);
 Serial1.end();
  Serial.println("1200");

 Serial1.begin(2400);
 Serial1.println("2400");
 delay(500);
 Serial1.end();
  Serial.println("2400");

 Serial1.begin(4800);
 Serial1.println("4800");
 delay(500);
 Serial1.end();
  Serial.println("4800");

 Serial1.begin(9600);
 Serial1.println("9600");
 delay(500);
 Serial1.end();
  Serial.println("9600");

 Serial1.begin(14400);
 Serial1.println("14400");
 delay(500);
 Serial1.end();
  Serial.println("14400");

 Serial1.begin(19200);
 Serial1.println("19200");
 delay(500);
 Serial1.end();
  Serial.println("19200");

 Serial1.begin(28800);
 Serial1.println("28800");
 delay(500);
 Serial1.end();
  Serial.println("28800");

 Serial1.begin(28400);
 Serial1.println("38400");
 delay(500);
 Serial1.end();
  Serial.println("38400");

 Serial1.begin(57600);
 Serial1.println("57600");
 delay(500);
 Serial1.end();
  Serial.println("57600");

 Serial1.begin(115200);
 Serial1.println("115200");
 delay(500);
 Serial1.end();
  Serial.println("115200");

 Serial.println("Acaba el loop");
 */
 delay(sleep);
}
